package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.components.Envelope;
import com.tida.servir.entities.*;
import com.tida.servir.services.GenericSelectModel;
import helpers.Encriptacion;
import helpers.Helpers;
import helpers.Logger;
import helpers.SimpleImageInfo;
import java.io.*;
import java.util.List;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.*;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.ApplicationGlobals;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.upload.services.UploadedFile;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

/**
 * Clase que maneja las unidades ejecutoras
 *
 * @author LFL
 */
public class EntidadEditor extends GeneralPage {

    @Inject
    private Session session;
    @SessionState
    private Usuario loggedUser;
    @SessionState
    @Property
    private UsuarioTrabajador usuarioTrabajador;
    @Inject
    private Request _request;
    @Property
    @SessionState
    private Entidad entidadSession;
    @Property
    @Persist
    private Entidad entidadUE;
//    @Component(id = "formulariomensajes")
//    private Form formulariomensajes;
    @InjectComponent
    private Zone mensajesZone;
//    @Component(id = "formularioentidad")
//    private Form formularioentidad;
    @Property
    @Persist
    private Ubigeo ubigeoEntidadUE;
    @InjectComponent
    @Property
    private Zone ubigeoEntidadZone;
    @Property
    @Persist
    private boolean bsector;
    @Property
    @Persist
    private boolean btipoorganismo;
//    @Component(id = "formularioubigeo")
//    private Form formularioubigeo;
    //Trabajador
//    @Component(id = "formulariotitular")
//    private Form formulariotitular;
//    @Component(id = "formulariojeferrhh")
//    private Form formulariojeferrhh;
//    @Component(id = "formulariojefeoga")
//    private Form formulariojefeoga;
//    @Component(id = "formulariobotones")
//    private Form formulariobotones;
    @Persist
    @Property
    private String nombreTrabajador;
//    @Property
//    private LkBusquedaTrabajador titulart;
//    @Property
//    private LkBusquedaTrabajador jeferrhht;
//    @Property
//    private LkBusquedaTrabajador jefeogat;
    @Persist
    @Property
    private String titular;
    @Persist
    @Property
    private String jefeOGA;
    @Persist
    @Property
    private String jefeRRHH;
    @Persist
    @Property
    private String jefeResponsable;
    @InjectComponent
    @Property
    private Zone autoridadZone;
    @Property
    @Persist
    private boolean bjefeOGAi;
    @Property
    @Persist
    private boolean bjefeRRHHi;
    @Inject
    private PropertyAccess _access;
    @InjectComponent
    @Property
    private Zone principalZone;
    @InjectComponent
    @Property
    private Zone botonesZone;
    @InjectComponent
    private Envelope envelope;
    @Inject
    private ApplicationGlobals globals;
    @Property
    @Persist
    private boolean mostrar;
    @Property
    private UploadedFile file;
    @Component(id = "formulariologoentidad")
    private Form formulariologoentidad;
    @Property
    private boolean bMuestraSectorEdicion;
    @Persist
    @Property
    private String entidad_origen;
    @Persist
    @Property
    private Boolean vformulario;
    @Persist
    @Property
    private Boolean vbotones;
    @Persist
    @Property
    private Boolean veliminar;
    @Persist
    @Property
    private Boolean veditar;
    @Inject
    private ComponentResources _resources;
    @Persist
    private UsuarioAcceso usua;
    @Persist
    private String STARTPATH;
    @Property
    @Persist
    private Funcionario funcionario;
    @Property
    @Persist
    private Integer tipoFuncionarioSeleccionado;
    @Property
    @Persist
    private ConfiguracionAcceso configuracion;

    @Log
    public void onActivate() {
        entidadUE = entidadSession;
    }

    @Log
    public void onActivate(Entidad eue) {
        entidadUE = eue;
    }

    /*
     * inicio de la carga de pagina
     * veditar : empieza en true, es utilizado en el .tml para controlar el acceso de edicion a los campos.
     */
    // inicio de pagina
    @Log
    @SetupRender
    private void inicio() {
        veditar = true;
        Query query = session.getNamedQuery("callSpUsuarioAccesoPagina");
        query.setParameter("in_login", usuarioTrabajador.getLogin());
        query.setParameter("in_pagename", _resources.getPageName().toUpperCase());
        List result = query.list();
        if (result.isEmpty()) {
            System.out.println(String.valueOf("Vacio:"));
        } else {
            usua = (UsuarioAcceso) result.get(0);
            if (usua.getAccesoupdate() == 1) {
                veditar = false;
                vbotones = true;
            }
            if (usua.getAccesodelete() == 1) {
                veliminar = true;
            }
            if (usua.getAccesoreport() == 1) {
                vformulario = true;
                vbotones = true;
            }
        }

        configuracion = new ConfiguracionAcceso();
        Criteria c = session.createCriteria(ConfiguracionAcceso.class);
        List<ConfiguracionAcceso> lista = c.list();
        configuracion = lista.get(0);

        STARTPATH = configuracion.getRuta_final();
        entidad_origen = "";

        File copied;
        copied = new File(STARTPATH + "logotipo/" + entidadUE.getLogotipo());
        if (!copied.exists()) {
            entidadUE.setLogotipo(null);
        } else {
            copiarimagen(copied);
        }

        if (entidadUE.getOrganizacionEstado() != null) {
            if (entidadUE.getOrganizacionEstado().getCodigo() == 5) {
                bMuestraSectorEdicion = true;
            } else {
                bMuestraSectorEdicion = false;
            }
        } else {
            bMuestraSectorEdicion = false;
        }
        limpiar();
        if (entidadUE.getDepartamento() != null) {
            ubigeoEntidadUE.setDepartamento(entidadUE.getDepartamento());
        }
        if (entidadUE.getProvincia() != null) {
            ubigeoEntidadUE.setProvincia(entidadUE.getProvincia());
        }
        if (entidadUE.getDistrito() != null) {
            ubigeoEntidadUE.setDistrito(entidadUE.getDistrito());
        }
//        if (entidadUE.getTitular() != null) {
//            titular = entidadUE.getTitular().getApellidoPaterno() + " " + entidadUE.getTitular().getApellidoMaterno() + ", " + entidadUE.getTitular().getNombres();
//        }
//        if (entidadUE.getJefeRRHH() != null) {
//            jefeRRHH = entidadUE.getJefeRRHH().getApellidoPaterno() + " " + entidadUE.getJefeRRHH().getApellidoMaterno() + ", " + entidadUE.getJefeRRHH().getNombres();
//        }
//        if (entidadUE.getJefeOga() != null) {
//            jefeOGA = entidadUE.getJefeOga().getApellidoPaterno() + " " + entidadUE.getJefeOga().getApellidoMaterno() + ", " + entidadUE.getJefeOga().getNombres();
//        }

        // TO-DO eliminado
        //if (entidadUE.getEsSubEntidad() == true) {
        //entidad_origen = entidadUE.getEntidad().getDenominacion();
//        } else {
//            entidad_origen = "";
//        }

        tipoFuncionarioSeleccionado = 1;
    }

    @Log
    public List<ConfiguracionAcceso> getRuta() {
        Criteria c = session.createCriteria(ConfiguracionAcceso.class);
        return c.list();
    }

    void limpiar() {
        jefeRRHH = null;
        titular = null;
        jefeOGA = null;
        ubigeoEntidadUE = new Ubigeo();
    }

    @Log
    static public String getExtension(String path) {
        String[] strings = path.split("\\.");
        if (strings.length > 2) {
            return "ERROR";
        } else {
            return strings[strings.length - 1];
        }

    }

    @CommitAfter
    Object onSuccessFromFormulariologoentidad() throws IOException {
        File copied;
        if (file == null) {
            formulariologoentidad.recordError("Seleccione imagen a subir.");
            return this;
        }
        //valida extension del archivo        
        String sArchivoExtension;
        sArchivoExtension = getExtension(file.getFileName());
        if (sArchivoExtension.equalsIgnoreCase("png") || sArchivoExtension.equalsIgnoreCase("jpg")
                || sArchivoExtension.equalsIgnoreCase("gif")) {
            //extension valida
        } else {
            formulariologoentidad.recordError("Solo puede subir archivos con la siguiente extension: .png, .jpg, .gif");
            //envelope.setContents("Solo puede subir archivos con la siguiente extension: .pdf, .jpg, .doc, .docx");
            return this;
        }
        //file.getSize();
        SimpleImageInfo imageInfo = new SimpleImageInfo(file.getStream());
        System.out.println(imageInfo);

        if (imageInfo.getHeight() > configuracion.getImageMaxHeight().intValue() || imageInfo.getWidth() > configuracion.getImageMaxWidth().intValue()) {
            formulariologoentidad.recordError("Dimensiones de la imagen sobrepasan el máximo permitido.");
            return this;
        }
        if (file.getSize() > configuracion.getImageMaxSize().intValue()) {
            formulariologoentidad.recordError("Tamaño de la imagen sobrepasa el máximo permitido.");
            return this;
        }

        String path = STARTPATH + "logotipo/";
        String nombreArchivo = Encriptacion.MD5(String.valueOf(entidadUE.getId())) + file.getFileName().substring(file.getFileName().length() - 4);
        File nuevo = new File(path + nombreArchivo);
        copied = new File(path);
        if (!copied.exists()) {
            copied.mkdirs();
        }
        file.write(nuevo);
        session.flush();
        entidadUE.setLogotipo(nombreArchivo);
        session.saveOrUpdate(entidadUE);
        return this;
    }

    void copiarimagen(File origen) {
        try {
            File destino = new File(globals.getServletContext().getRealPath("/") + "images/logotipo/" + entidadUE.getLogotipo());
            InputStream in = new FileInputStream(origen);
            OutputStream out = new FileOutputStream(destino);
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
        } catch (Exception e) {
        }
    }

    // cargar combos
    //para obtener datatos del Nivel Gobierno
    public GenericSelectModel<DatoAuxiliar> getNivelGobierno() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("NIVELGOBIERNO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    //para obtener datatos del Sector Gobierno
    public GenericSelectModel<DatoAuxiliar> getSectorGobierno() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("SECTORGOBIERNO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    //para obtener datatos de la Organizacion
    public GenericSelectModel<DatoAuxiliar> getOrganizacionEstado() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("ORGANIZACIONESTADO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    //para obtener datatos del Tipo Organismo
    public GenericSelectModel<DatoAuxiliar> getTipoOrganismo() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOORGANISMO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    //para obtener datatos del Tipo Via
    public GenericSelectModel<DatoAuxiliar> getTipoVia() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOVIA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    //para obtener datatos del Tipo Zona
    public GenericSelectModel<DatoAuxiliar> getTipoZona() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOZONA", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    //para obtener datatos del Tipo Entidad
    public GenericSelectModel<DatoAuxiliar> getTipoSubEntidad() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPOSUBENTIDAD", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }
    final static private String charset = "[a-zA-Z0-9_]"; // separate this out for future fixes
    final static private String regex = charset + "+@" + charset + "+." + charset + "+";
    final static private String regexp = charset + "+@" + charset + "+." + charset + "+." + charset + "+";

    boolean validEmail(String email) {
        if(!email.matches(regex)){
            if(email.matches(regexp)){
                return true;
            }else{
                return false;
            }
        }else{
            return true;
        }
    }

    // formulario principal
    @CommitAfter
    Object onSuccessFromFormulariobotones() {
        entidadUE.setDepartamento(ubigeoEntidadUE.getDepartamento());
        entidadUE.setProvincia(ubigeoEntidadUE.getProvincia());
        entidadUE.setDistrito(ubigeoEntidadUE.getDistrito());
        if (validEmail(entidadUE.getCorreoJefeTransparencia())){
            //new InternetAddress(entidadUE.getCorreoJefeTransparencia()).getAddress();
            session.saveOrUpdate(entidadUE);
            session.flush();
            envelope.setContents("Entidad modificada exitosamente");
            new Logger().loguearEvento(session, Logger.MODIFICACION_ENTIDADES, entidadUE.getId(), loggedUser.getId(), loggedUser.getId(), Logger.MOTIVO_MODIFICACION_ENTIDADES, entidadUE.getId());
        }else{
            envelope.setContents("Ingrese un email válido para el Jefe de Transparencia.");
        }
//        for (int x = 0; x < entidadUE.getDescriptores().length(); x++) {
//            if (entidadUE.getDescriptores().charAt(x) == ' ') {
//                envelope.setContents("Descriptores deben estar separador por comas.");
//                return new MultiZoneUpdate("principalZone", principalZone.getBody()).add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).add("autoridadZone", autoridadZone.getBody()).add("mensajesZone", mensajesZone.getBody());
//            }
//        }
        if (entidadUE.getOrganizacionEstado() != null) {
            if (entidadUE.getOrganizacionEstado().getCodigo() == 5) {
                bMuestraSectorEdicion = true;
            } else {
                bMuestraSectorEdicion = false;
            }
        } else {
            bMuestraSectorEdicion = false;
        }
        return new MultiZoneUpdate("principalZone", principalZone.getBody()).add("ubigeoEntidadZone", ubigeoEntidadZone.getBody()).add("autoridadZone", autoridadZone.getBody()).add("mensajesZone", mensajesZone.getBody());
    }

    @Log
    public Object onCancelar() {
        return "Alerta";
    }

//    public List<LkBusquedaTrabajador> getTrabajadores() {
//        Criteria c = session.createCriteria(LkBusquedaTrabajador.class);
//        c.add(Restrictions.eq("entidad_id", entidadUE.getId()));
//        System.out.println("nombress: " + nombreTrabajador);
//        if (nombreTrabajador != null) {
//            c.add(Restrictions.disjunction().add(Restrictions.like("nombretrabajador", nombreTrabajador + "%").ignoreCase()).add(Restrictions.like("nombretrabajador", nombreTrabajador.replaceAll("ñ", "n") + "%").ignoreCase()).add(Restrictions.like("nombretrabajador", nombreTrabajador.replaceAll("n", "ñ") + "%").ignoreCase()));
//        }
//        return c.list();
//    }

    // eventos de cambio de valor en los campos
    void onSiglaChanged() {
        entidadUE.setSigla(_request.getParameter("param"));
    }

    void onDireccionChanged() {
        entidadUE.setDescvia(_request.getParameter("param"));
    }

    void onDescZonaChanged() {
        entidadUE.setDescZona(_request.getParameter("param"));
    }

    void onEmailInstitucionalChanged() {
        entidadUE.setEmailInstitucional(_request.getParameter("param"));
    }

    void onUrlEntidadChanged() {
        entidadUE.setUrlEntidad(_request.getParameter("param"));
    }

    void onTelefonoEntidadChanged() {
        entidadUE.setTelefonoEntidad(_request.getParameter("param"));
    }

    void onDescriptoresChanged() {
        entidadUE.setDescriptores(_request.getParameter("param"));
    }

    void onMisionChanged() {
        entidadUE.setMision(_request.getParameter("param"));
    }

    void onLeyCreacionChanged() {
        entidadUE.setLeyCreacion(_request.getParameter("param"));
    }

//    @Log
//    void onSelectedFrombuscarTitular() {
//        tipoFuncionarioSeleccionado = 1;
//    }
//
//    @Log
//    void onSelectedFrombuscarjeferrhh() {
//        tipoFuncionarioSeleccionado = 2;
//    }
//
//    @Log
//    void onSelectedFrombuscarjefeoga() {
//        tipoFuncionarioSeleccionado = 3;
//    }
//
//    @Log
//    void onSelectedFrombuscarjeferesponsable() {
//        tipoFuncionarioSeleccionado = 4;
//    }
//    @Log
//    public String getActualizaFuncionario() {
//        System.out.println("titular");
//        if (tipoFuncionarioSeleccionado != null) {
//            if (funcionario != null) {
//                if (tipoFuncionarioSeleccionado == 1) {
//                    titular = funcionario.getApellidoPaterno() + ' ' + funcionario.getApellidoMaterno() + ' ' + funcionario.getNombres();
//                    entidadUE.setCargoTitular(funcionario.getDen_cargo());
//                    entidadUE.setTitular(funcionario);
//                }
//                if (tipoFuncionarioSeleccionado == 2) {
//                    jefeRRHH = funcionario.getApellidoPaterno() + ' ' + funcionario.getApellidoMaterno() + ' ' + funcionario.getNombres();
//                    entidadUE.setCargoJefeRRHH(funcionario.getDen_cargo());
//                    entidadUE.setJefeRRHH(funcionario);
//                }
//                if (tipoFuncionarioSeleccionado == 3) {
//                    jefeOGA = funcionario.getApellidoPaterno() + ' ' + funcionario.getApellidoMaterno() + ' ' + funcionario.getNombres();
//                    entidadUE.setCargoJefeOga(funcionario.getDen_cargo());
//                    entidadUE.setJefeOga(funcionario);
//                }
//                if (tipoFuncionarioSeleccionado == 4) {
//                    jefeResponsable = funcionario.getApellidoPaterno() + ' ' + funcionario.getApellidoMaterno() + ' ' + funcionario.getNombres();
//                    entidadUE.setCargoJefeTransparencia(funcionario.getDen_cargo());
//                    entidadUE.setJefeTransparencia(funcionario);
//                }
//            }
//        }
//        return "";
//    }
    void onTitularChanged() {
        System.out.println("onTitularChanged");
        entidadUE.setTitular(_request.getParameter("param"));
    }

    void onJefeRRHHChanged() {
        entidadUE.setJefeRRHH(_request.getParameter("param"));
    }

    void onJefeogaChanged() {
        entidadUE.setJefeOga(_request.getParameter("param"));
    }

    void onJefetransparenciaChanged() {
        entidadUE.setJefeTransparencia(_request.getParameter("param"));
    }

    void onCargotitularChanged() {
        System.out.println("onCargotitularChanged");
        entidadUE.setCargoTitular(_request.getParameter("param"));
    }

    void onCargojefeRRHHChanged() {
        entidadUE.setCargoJefeRRHH(_request.getParameter("param"));
    }

    void onCargojefeogaChanged() {
        entidadUE.setCargoJefeOga(_request.getParameter("param"));
    }

    void onCargojefetransparenciaChanged() {
        entidadUE.setCargoJefeTransparencia(_request.getParameter("param"));
    }

    void oncorreojefetransparenciaChanged() {
        entidadUE.setCorreoJefeTransparencia(_request.getParameter("param"));
    }
}
